//给你一个字符串 s ，仅反转字符串中的所有元音字母，并返回结果字符串。 
//
// 元音字母包括 'a'、'e'、'i'、'o'、'u'，且可能以大小写两种形式出现。 
//
// 
//
// 示例 1： 
//
// 
//输入：s = "hello"
//输出："holle"
// 
//
// 示例 2： 
//
// 
//输入：s = "leetcode"
//输出："leotcede" 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 3 * 105 
// s 由 可打印的 ASCII 字符组成 
// 
// Related Topics 双指针 字符串 
// 👍 229 👎 0

package com.cute.leetcode.editor.cn;

import java.util.HashSet;
import java.util.Set;

public class ReverseVowelsOfAString {
    public static void main(String[] args) {
        Solution solution = new ReverseVowelsOfAString().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        /**
         * 双指针解决倒是可以，时间上还能优化，空间上更是能优化
         */
        public String reverseVowels(String s) {
            Set<Character> set = new HashSet<>();
            set.add('a');set.add('e');set.add('i');set.add('o');set.add('u');
            set.add('A');set.add('E');set.add('I');set.add('O');set.add('U');
            char[] chars = s.toCharArray();
            int left = 0;int right = chars.length-1;
            while (left<right){
                if (set.contains(chars[left])&&set.contains(chars[left])) swap(left, right, chars);
                else {
                    if (!set.contains(chars[left])) left++;
                    if (!set.contains(chars[right])) right--;
                }
            }
            return new String(chars);
        }
        public void swap(int left, int right,char[] chars){
            char temp = chars[left];
            chars[left] = chars[right];
            chars[right] = temp;
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)

}